package cn.ronghuanet.org.service.impl;

import cn.ronghuanet.base.constants.BaseConstans;
import cn.ronghuanet.base.exception.BusinessException;
import cn.ronghuanet.base.exception.ResponseCode;
import cn.ronghuanet.base.exception.RonghuaAssert;
import cn.ronghuanet.base.util.BaiduAuditUtil;
import cn.ronghuanet.org.domain.Employee;
import cn.ronghuanet.org.domain.Shop;
import cn.ronghuanet.org.domain.ShopAuditLog;
import cn.ronghuanet.org.domain.ShopEmployee;
import cn.ronghuanet.org.dto.ShopAdminDTO;
import cn.ronghuanet.org.dto.ShopRegisterDTO;
import cn.ronghuanet.org.mapper.EmployeeMapper;
import cn.ronghuanet.org.mapper.ShopAuditLogMapper;
import cn.ronghuanet.org.mapper.ShopEmployeeMapper;
import cn.ronghuanet.org.mapper.ShopMapper;
import cn.ronghuanet.org.service.IEmployeeService;
import cn.ronghuanet.org.service.IShopService;
import cn.ronghuanet.base.service.impl.BaseServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xiong
 * @since 2023-06-27
 */
@Service
public class ShopServiceImpl extends BaseServiceImpl<Shop> implements IShopService {

    @Autowired
    private ShopMapper shopMapper;

    @Autowired
    private EmployeeMapper employeeMapper;

    @Autowired
    private ShopEmployeeMapper shopEmployeeMapper;

    @Autowired
    private ShopAuditLogMapper shopAuditLogMapper;

    @Autowired
    private IEmployeeService employeeService;

    /**
     * 店铺入驻
     * @param dto
     */
    @Transactional
    @Override
    public void settlement(ShopRegisterDTO dto) {
        ShopAdminDTO admin = dto.getAdmin();
        // 1 参数校验
        validateParam(dto, admin);

        // 2 创建店铺对象,做新增
        Shop shop = new Shop();
        BeanUtils.copyProperties(dto,shop);
        shop.setRegisterTime(new Date());

        // 对店铺信息做审核
        List<String> texts = Arrays.asList(dto.getName(), dto.getAddress());
        List<String> imgUrls = Arrays.asList(dto.getLogo());
        //Map<String, Object> map = BaiduAuditUtil.censor(texts, imgUrls);
        Map<String,Object> map = new HashMap<>();
        map.put("success",true);
        Boolean success = (Boolean)map.get("success");

        ShopAuditLog log = new ShopAuditLog();
        log.setAuditId(0L); // 系统自动审核,是没有审核人的,因此要不然设置0L,或者设置null
        log.setAuditTime(new Date());
        if(success){
            // 2.1 审核通过,店铺状态=审核通过
            shop.setState(BaseConstans.ShopState.STATE_WAIT_ACTIVE);

            log.setState(BaseConstans.ShopAuditLogState.SHOP_AUDIT_LOG_STATE_PASS);
            log.setNote("自动审核通过!");
        }else{
            // 2.2 审核不通过,状态=驳回
            shop.setState(BaseConstans.ShopState.STATE_REJECT_AUDIT);

            log.setState(BaseConstans.ShopAuditLogState.SHOP_AUDIT_LOG_STATE_REJECT);
            log.setNote(map.get("message").toString());
        }

        // 2.3 保存店铺信息到店铺表
        shopMapper.insert(shop);

        // 3 保存管理员信息到数据库
        // 思考?? 如果这个管理员的信息之前已经存在了呢?
        // 方案一:如果管理员信息已经存在,就不让做店铺入驻,而是到管理员的店铺列表做新增
        // 方案二:如果管理员信息已经存在,就用已经存在的管理员信息与店铺做关联绑定(采纳这种)

        // 判断管理员信息是否存在 - 通过手机号判断管理员是否存在
        Employee employee = employeeMapper.loadByPhone(admin.getPhone());

        ShopEmployee shopEmployee = new ShopEmployee();
        if(Objects.isNull(employee)){
            // 3.2 如果管理员信息不存在,就新增管理员信息,要将新增的管理员与店铺做绑定
            employee = new Employee();
            BeanUtils.copyProperties(admin,employee);
            // 当店铺没有激活时,店铺的管理员应该也是不能用的,因此员工状态=待激活
            employee.setState(BaseConstans.Employee.STATE_WAIT_AUTID);
            // 在新增员工的时候,还要新增logininfo的信息,而不止是店铺入驻才有员工,平台的员工也要能够新增进来
            employeeService.saveEmployee(employee);
            //employeeMapper.insert(employee);
        }
        // 保存管理员和店铺的关联关系
        // 不管员工存不存在,最终都是要用管理员的id和店铺的id做绑定的
        // 只是如果管理员存在的话,是取数据库的id,如果管理员不存在,取新增后自增长的主键id
        shopEmployee.setEmployeeId(employee.getId());
        shopEmployee.setShopId(shop.getId());
        shopEmployee.setIsAdmin(1);
        shopEmployeeMapper.insert(shopEmployee);

        // 4 保存店铺审核日志信息
        log.setShopId(shop.getId());
        shopAuditLogMapper.insert(log);

        // 5 发送邮件给店铺管理员 拿到当前管理员的邮箱作为收件人
        // 恭喜你,店铺信息审核通过,请点击激活链接及时进行激活!<a href='http://localhost:8080/shop/active/62'>点此处进行激活</a>
        // 拼接上面这个激活链接的时候,店铺id不能写死的,而应该取当前这个新增店铺的id
        // 5.1 审核通过,发送激活邮件
        // 5.2 审核失败,发送驳回邮件,驳回邮件中要包含驳回信息
    }

    private void validateParam(ShopRegisterDTO dto, ShopAdminDTO admin) {
        // 1 参数校验
        // 1.1 参数非空校验 - 下面这些判断只要有一个为空,就要返回给前端一个错误信息
        /*if(Objects.isNull(dto) || Objects.isNull(admin) || StringUtils.isBlank(dto.getName()) ||
            StringUtils.isBlank(dto.getTel()) || StringUtils.isBlank(dto.getAddress()) || StringUtils.isBlank(admin.getUsername())
            || StringUtils.isBlank(admin.getEmail()) || StringUtils.isBlank(admin.getPhone()) || StringUtils.isBlank(admin.getPassword())
            || StringUtils.isBlank(admin.getConfirmPassword())){
            throw new BusinessException("店铺入驻信息不能为空!请检查后重新提交!");
        }*/

        // 1.2 校验两次密码是否一致
        /*if(!admin.getPassword().equals(admin.getConfirmPassword())){
            throw new BusinessException("两次密码不一致,请检查后重新提交!");
        }*/
        RonghuaAssert.isEq(admin.getPassword(),admin.getConfirmPassword(), ResponseCode.RESPONSE_CODE_40011);

        // 1.3 校验店铺名称是否存在,如果店铺名称存在,返回错误信息给前端
        Shop shop = shopMapper.loadByName(dto.getName());
        RonghuaAssert.isNull(shop,ResponseCode.RESPONSE_CODE_40012);

        /*if(Objects.nonNull(shop)){
            // 如果对象不为空,说明当前店铺名称已经存在
            throw new BusinessException("该店铺名称已存在,请重新输入!");
        }*/
    }
}
